/*
 * @Author: 晟松
 * @Date: 2021-12-08 20:45:48
 * @LastEditors: 晟松
 * @LastEditTime: 2022-03-09 17:17:03
 * @FilePath: \mini-vue3d:\Code\node\koa2\volunteer-service\src\main\service\CommunityService.js
 * @Description: 校级管理者和院级管理者的操作
 */

import sequelize from "@main/db";
import { isNull, isBlank } from "@main/util/ValidateUtil";
import {
    ParamError,
    LoginError,
    NotFoundError,
} from "@main/common/CommonError";
import { encryptPassword, checkPassword } from "@main/util/PasswordUtil";
import config from "@main/config";
import blacklist from "blacklist";
import whiteListed from "whitelisted";
import jwt from "jsonwebtoken";
import enums from "@main/config/enums";
import { toEnumNum, toEnumStr } from "@main/util/EnumsUtil";
import { uploadFile } from "@main/util/UploadUtils";
import { xlsxAnalysis } from "@main/util/XlsxUtils";
import UserService from "./UserService";
import { Op } from "sequelize/dist";
import Web3Service from "./Web3Service";

// 获取所有定义的model
const models = sequelize.models;

class CommunityService {
    /**
     * @description: 居委会审核居民
     * @param {*} params
     * @return {*}
     */
    static async communityReview(params) {
        // id为居民id
        let { id } = params;
        let res =  await models["resident"].update(
            {
                available: true,
            },
            {
                where: {
                    id,
                },
            }
        );
        
        await Web3Service.updateOne("resident", id);
        return res
    }
    /**
     * @description: 获得所有的居民信息
     * @param {*} params
     * @return {*}
     */
    static async getAllResident(params) {
        // id为居委会id
        let { id, limit, offset } = params;
        let all = await models["resident"].findAll({
            where: {
                communityId: id,
            },
            limit,
            offset,
            include:models['login']
        });
        
        for (let i = 0; i < all.length; i++) {
            all[i].dataValues.phone = all[i].login.phone;
            // console.log(i);
        }
        return all;
    }

    /**
     * @description: 查询满足条件的所有自己的居民
     * @param {*} params 主要是通过里面的姓名，手机号，是否可用这些条件进行查询
     * @return {*}
     */
     static async searchAllResident(params) {
        let { id, limit, offset, userName, phone, available } = params;
        // console.log('available: ',typeof available);
        // 这里解构出来的limit和offset是string类型，需要转换为number类型，如果存在的话
        if (!isNull(limit)) limit -= 0;
        if (!isNull(offset)) offset -= 0;
        // 通过school关联查询

        // 主要是apipost里面传来的数据可能是字符形式，需要处理
        if (typeof available == "string") {
            if (available === "true") {
                available = true;
            } else if (available === "false") {
                available = false;
            }
        }

        // 传来的available可能是undefined类型，进行查询时会有问题，需要转换
        if (isBlank(available)) {
            available = [true, false];
        } else {
            // 这里转为数组是为了查询时的op.or的特殊处理
            available = [available];
        }

        if (isBlank(userName)) {
            userName = "";
        }

        // console.log(available);
        // 通过student外键查询和通配符模糊查询
        let all = await models["resident"].findAll({
            where: {
                communityId: id,
                userName: {
                    // userName必定传来一个空字符串
                    [Op.like]: `%${userName}%`,
                },
                available: {
                    // 这里使用op.or是为了处理值为null这种特殊情况
                    [Op.or]: [...available],
                },
            },
            limit,
            offset,
            include: models["login"],
        });

        for (let i = 0; i < all.length; i++) {
            all[i].dataValues.phone = all[i].login.phone;
            // console.log(i);
        }
        // 如果存在手机号的话，也进行模糊匹配
        if (!isBlank(phone)) {
            let res = all.filter((item) => {
                if (item.login.phone.includes(phone)) return item;
            });
            console.log("phone res: ", res);
            return res;
        }
        return all;
    }

    /**
     * @description:
     * @param {*} file
     * @param {*} params
     * @return {*}
     */
    static async batchRegisterResident(file, params) {
        // id为院级管理员id
        // let { id } = params;
        // 先将file存储到本地服务器
        await uploadFile(file);
        // 然后解析xlsx文件
        let xlsxData = []
        // console.log("xlsxData: ", xlsxData);

        if (fileName) {
            xlsxData = await new Promise(function (resolve, reject) {
                resolve(xlsxAnalysis(fileName, "student"));
            });
        } else {
            // 先将file存储到本地服务器
            let save = await localSave(file);
            console.log("save: ", save);
            // 然后解析xlsx文件
            console.warn("注意这里的话，似乎上面存储在本地时可能没有存储完，所以下面执行时可能会获取不到存储的文件，造成错误");
            xlsxData = await xlsxAnalysis(save.key, "student");
        }


        // 批量注册学生
        let res = [];
        for (let i = 0; i < xlsxData.length; i++) {
            let residentInfo = xlsxData[i];
            res.push(await UserService.create(residentInfo, true));
        }

        return res;
    }
}

export default CommunityService;
